package _11_整理题目._整理基础._集合源码;

import org.junit.Test;

import java.lang.reflect.Field;

public class _Integer源码_缓存机制 {
    @Test
    public void testIntegerCache1() {
        // 此处连个都是 值 等于，由于 Integer 源码中 默认缓存了 [-128, 127]，以支持自动装箱
        // -XX:AutoBoxCacheMax=20000 可以通过设置此参数修改默认缓存值大小
        
        // IntegerCache 有一个静态代码块,JVM在加载Integer这个类时,会优先加载静态的代码。
        // 当JVM进程启动完毕后, -128 ~ +127 范围的数字会被缓存起来,
        // 调用valueOf方法的时候,如果是这个范围内的数字,则直接从缓存取出
        // （在装箱的时候自动调用的是Integer的valueOf(int)方法）
        // 超过这个范围的,就只能构造新的Integer对象了。
        Integer a = 5;
        Integer b = 5;
        System.out.println("a == b " + (a==b));
        Integer a1 = 127;
        Integer b1 = 127;
        System.out.println("a1 == b1 " + (a1==b1));
        Integer a2 = 128;
        Integer b2 = 128;
        System.out.println("a2 == b2 " + (a2==b2));
        Integer c = 500;
        Integer d = 500;
        System.out.println("c == d " + (c==d));
        
        Integer e = new Integer(5);
        Integer f = new Integer(5);
        System.out.println("e == f " + (e==f));// false 因为 new 的都是新对象
    }
    
    public static void main(String[] args) throws Exception {
        //内部类需要使用$分隔
        Class c = Class.forName("java.lang.Integer$IntegerCache");
    
        Field low = c.getDeclaredField("low");
        low.setAccessible(true);
        System.out.println("low = " + low.get(null));
    
        Field high = c.getDeclaredField("high");
        high.setAccessible(true);
        System.out.println("high = " + high.get(null));
    
        Integer q = 500;
        Integer d = 500;
        System.out.println("c == d " + (q==d));
    }
    
    @Test
    public void testPlus() {
        int i1 = 2;
        int j1 = i1++ * 30;
        System.out.println("i1 = " + i1);
        System.out.println("j1 = " + j1);
        
        int i2 = 2;
        int j2 = ++i2 * 30;
        System.out.println("i2 = " + i2);
        System.out.println("j2 = " + j2);
    }
}
